/* PROJECTO: Projecto 3
 * FICHEIRO: interface.cpp
 *
 * DESCRIÇÃO: Codigo correspondente a interface.
 *            Nao tem implementada o metodo CarregarSave() e o MostrarPontuacoes()
 *
 * TURMA / GRUPO: Turma 1 / Grupo 12
 * AUTORES: Fábio Domingo da Silva Rodrigues
 *          Rolando Emanuel Lopes Pereira
 *
 * DECLARAÇÃO:
 * Declaramos sob compromisso de honra que este trabalho nas suas partes
 * constituintes de código (e relatório, se aplicável) é original e da nossa
 * autoria, não correspondendo, portanto, a cópia ou tradução de outros
 * trabalhos já realizados, na FEUP ou fora dela.
 * Mais declaramos que todos os documentos ou código que serviram de base ao
 * desenvolvimento do trabalho descrito no relatório e seus anexos são
 * adequadamente citados e explicados na respectiva secção de referências
 * bibliográficas e que todas as eventuais partes transcritas ou utilizadas de
 * outras fontes estão devidamente assinaladas, identificadas e evidenciadas.
 * Subscrevemos a declaração acima:
 * Fábio Domingo da Silva Rodrigues
 * Rolando Emanuel Lopes Pereira
 *
 * REFERÊNCIAS E FONTES DE INFORMAÇÃO UTILIZADAS:
 *
 * SISTEMA OPERATIVO:
 * Debian 4.0
 * AMBIENTE DE DESENVOLVIMENTO:
 * Vim 7.0.235
 *
 * DATA DE INÍCIO: 20/05/2009
 * DATA DE CONCLUSÃO: 1/06/2009
 *
 * */

#include <iostream>
#include "interface.h"
#include <string>

using std::cout;
using std::cin;
using std::endl;
using std::string;


//Interface::Interface(Jogador jog1, Jogador jog2) : tabuleiro(jog1, jog2)
Interface::Interface()
{
    tabuleiro.LerFicheiroTabuleiro("infotabuleiro.txt");
    
    srand ( time(NULL) ); //inicializa gerador de numeros aleatorios
}

Interface::~Interface()
{

}

void Interface::MenuInicial()
{
	int escolha = -1;

	do
    {
        cout << "1. Novo Jogo" << endl
             << "2. Carregar Jogo" << endl
             << "3. Ver Melhores Pontuacoes" << endl;
        // TODO: Utilizar atoi como no primeiro trabalho
        cout << "Escolha uma opcao: ";
        cin >> escolha;
        
    } while (escolha <= 0 || escolha >= 4);

    if (escolha == 1)
    {
        NovoJogo();
        MenuJogada();
    }
    
    else if (escolha == 2)
        CarregarSave();
    else
        MostrarPontuacoes();
}

Jogador& Interface::JogadorActual()
{
    if (turnoJogador == 1)
        return jog1;
    else
        return jog2;
}

void Interface::MenuJogada()
{

    bool continuar = false;
    
    while (!continuar)
    {
        MudarTurno();
        
        tabuleiro.VisualizarTabuleiro();

        Jogador *jog_actual;
        
        // Nao funciona
        //Jogador *jog_actual = JogadorActual();
        if (turnoJogador == 1)
        {
            jog_actual = &jog1;
        }
        else
        {
            jog_actual = &jog2;
        }
        
        
        Casa casa_actual = tabuleiro.getCasa(jog_actual->getPosicao()+1);
        //cout << tabuleiro.getCasa(jog_actual.getPosicao()).getNome();
        //Casa casa_actual = tabuleiro.getCasa(jog_actual.getPosicao());
    

        int opcao = 0;
    
        do
        {
            cout << "Vez do " << jog_actual->getNome() << ". Encontra-se na "
                 << casa_actual.getNome() << " (Casa nº " << jog_actual->getPosicao()+1 << "). " << endl
                 << " 1) Jogar" << endl
                 << " 2) Ver informacoes da casa" << endl
                 << " 3) Gravar jogo" << endl
                 << " 4) Sair" << endl;
            cout << "O que deseja fazer? ";

            cin >> opcao;
        
        } while (opcao <= 0 || opcao >= 5);

        if (opcao == 1)
        {
            int lancamento = LancarDados();
            //cout << lancamento;
            tabuleiro.AvancarJogador(jog_actual, lancamento);
        
        }
        else if (opcao == 2)
        {
            cout << "Qual a casa que quer ver? ";
            int num;
            cin >> num;

            Casa casa = tabuleiro.getCasa(num);

            cout << "Casa: " << casa.getNome() << endl
                 << "Posicao: " << num << endl
                 << "Custo de compra: " << casa.getCusto() << endl
                 << "Renda sem casas: " << casa.getRendaBase() << endl
                 << "Valor para adicionar casas: " << casa.getValorCasa() << endl
                 << "Numero de casas: " << casa.getCasas() << endl;

            string temp;
            cin >> temp;
                        
            
        }
        else if (opcao == 4)
        {
            continuar = true;
            
        }
    }
    
    
	// if (not int opcao || opcao > 4) //TODO: 5 para casas e hoteis
    // {
    //     cout << " Por favor escolha uma opcao" << endl;
    //     cout << "O que deseja fazer? ";
	// }
    // else
    //     cin >> opcao;
}

void Interface::MenuVerCasa(Jogador& jogador, int posicao)
{   
    tabuleiro.VisualizarTabuleiro();
    
    Casa casa = tabuleiro.getCasa(posicao);
    
    cout << endl << "Posicao :" << jogador.getPosicao() << " - "
         << casa.getTipo() << endl
         << "Nome : " << casa.getNome() << endl
         << "Valor : " << casa.getCusto() << endl
         << "Renda : " << casa.getRendaBase() << endl;
    
    if (casa.getDono() == "")
    {
        cout << "Sem dono" << endl
             << "--------------------------------" << endl
             << "Deseja comprar esta propriedade por "
             << casa.getCusto() << " ? ";
		 
        string compra;
		 
        cin >> compra;
		 
        if (compra == "Sim")
            tabuleiro.ComprarCasa(jogador, casa);
    }
    else 
    {
    
        cout << casa.getDono() << endl;
        cout << "Numero de casas : " <<  casa.getCasas();
        cout << "Renda a pagar : " << casa.getRendaReal() << endl;
        cout << casa.getDono() << endl;
    }
}

int Interface::LancarDados()
{

    int dado1, dado2, resultado;

    /* Devolve a soma dos dados (segundo a Distribuicao de Gauss e diferente
       somar 2 lancamentos de dados de 1 a 6, do que lancar so um dado de 12
       faces.
    */
    dado1 = rand() % 6 + 1; 
    dado2 = rand() % 6 + 1;

    return dado1 + dado2;
}

int Interface::NovoJogo()
{
	cout << "Nome do Jogador 1: ";

    string nome1;
    cin >> nome1;

    string identificador1;
    
    do
    {
        cout << "Identificador do Jogador 1: ";
        cin >> identificador1;
    } while (identificador1.size() != 2);

    cout << "Nome do Jogador 2: ";

    string nome2;
    cin >> nome2;

    string identificador2;
    do
    {
        cout << "Identificador do Jogador 2: ";
        cin >> identificador2;
    } while (identificador2.size() != 2);

    jog1.setNome(nome1);
    jog1.setIdentificador(identificador1);

    jog2.setNome(nome2);
    jog2.setIdentificador(identificador2);

    // Esta funcao coloca o dinheiro com o valor certo
    tabuleiro.addJogadores(jog1, jog2);
}

int Interface::Inicio()
{
    int start;
    start =	rand() % 2 + 1;

    return start;
}

int Interface::MudarTurno()
{
	if (turnoJogador == 1)
		turnoJogador = 2;
	else
		turnoJogador = 1;
	
	return turnoJogador;
}

void Interface::CarregarSave()
{
    
}


void Interface::MostrarPontuacoes()
{
    
}
